package main

import (
	"fmt"
	"log"
	"math/rand"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"gorm.io/driver/sqlite"
)


type User struct {
	gorm.Model
	Name string `gorm:"type:varchar(20);not null"`
	Telephone string `gorm:"varchar(11);not null;unique"`
	password string `gorm:"size:255;not null"`
}
// 在 RESTful API 中，使用的主要是以下五种HTTP方法：
//  GET，表示读取服务器上的资源
//  POST，表示在服务器上创建资源
//  PUT,表示更新或者替换服务器上的资源
//  DELETE，表示删除服务器上的资源
//  PATCH，表示更新/修改资源的一部分

func main() {
	db := InitDB()
	// 声明一个默认路由
	r := gin.Default()

	// localhost:8080/api/auth/register
	r.POST("/api/auth/register", func(ctx *gin.Context) {
		//获取参数
		name := ctx.PostForm("name")
		telephone := ctx.PostForm("telephone")
		password := ctx.PostForm("password")

		//数据验证
		if len(telephone) != 11{
			ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "手机号必须是11位"})
			return
		}
		if len(password) < 6 {
			ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "密码不能少于6位数"})
			return
		}

		if len(name) == 0{
			name = RandomString(10)
			return
		}
		log.Println(name, telephone, password)
		//判断是否存在
		if TelephoneExist(db, telephone){
			ctx.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "密码不能少于6位用户已存在"})
			return
		}
		//创建用户
		newUser := User{
			Name:		name,
			Telephone: telephone,
			password:  password,
		}
		//返回结果

		ctx.JSON(200, gin.H{
			"msg": "注册成功",
		})
	})
	panic(r.Run(":8080"))
}


//随机字符串
func RandomString(n int) string {
	var letters = []byte("abcdefghijklmopqrstuvwxwzABCDEFGHIJKLMOPQRSTUVWXYZ")
	result := make([]byte, n)
	rand.Seed(time.Now().Unix())
	for i := range result{
		result[i] =letters[rand.Intn(len(letters))]
	}
	return string(result)
}


//连接数据库
func InitDB() *gorm.DB {
	driverName := "pgsql"
	host := "localhost"
	port := "3306"
	database := "ginessential"
	username := "root"
	password := "lgl021026"
	charset := "utf8"
	args := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=ture",
		username,
		password,
		host,
		port,
		database,
		charset)
	db, err := gorm.Open(driverName, args)
	if err != nil {
		panic("fail to connect database, err: " + err.Error())
	}
	return db
}

//检查手机号是否存在
func TelephoneExist(db *gorm.DB,telephone string) bool {
	var user User
	db.Where("telephone = ?", telephone).First(&user)
	if user.ID != 0{
		return true
	}
	return false
}